#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>

#define true 1
#define false 0

/*
 * 创建一个守护进程，然后利用这个守护进程每隔一分钟向daemon.log文件中写入当前时间，当守护进程收到 SIGQUIT 信号后退出
 *
 * sudo kill -3 pid
 */
 
static int flag = true;
void create_daemon();
void handler(int);

int main()
{
  time_t t;
  int fd;	
  struct sigaction act;

  create_daemon();
  act.sa_handler = handler;
  sigemptyset(&act.sa_mask);
  act.sa_flags = 0;

  if(sigaction(SIGQUIT, &act, NULL)) {
    printf("sigaction error.\n");
    exit(0);
  }

  while(flag) {
    fd = open("/home/share/work/test-verification/daemon/daemon4.log", O_WRONLY | O_CREAT | O_APPEND, 0644);
    if(fd == -1) {
      printf("open error\n");
    }

    t = time(0);
    char *buf = asctime(localtime(&t));
    write(fd, buf, strlen(buf));
    close(fd);
    sleep(60);
  }

  return 0;
}

void handler(int sig)
{
  printf("I got a signal %d\nI'm quitting.\n", sig);
  flag = false;
}

void create_daemon()
{
  pid_t pid;
  int i;

  pid = fork();

  if(pid == -1) {
    printf("fork error\n");
    exit(1);
  }
  else if(pid) {
    exit(0);
  }

  if(-1 == setsid()) {
    printf("setsid error\n");
    exit(1);
  }

  pid = fork();
  if(pid == -1) {
    printf("fork error\n");
    exit(1);
  }

  else if(pid) {
    exit(0);
  }

  chdir("/");	
  for(i = 0; i < 3; ++i) {
    close(i);
  }

  umask(0);
}

